#define _CRT_SECURE_NO_WARNINGS 1;
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::ostream;
using std::string;

void test()
{
	string str1("hello, world!");
	string str2("hello,world!!!!!!!!!!!!!!!!!!!!!!!!!!");
	//在C++中，sizeof(str)与sizeof(string)的大小相同，
	//是因为两者本质上都在计算std::string类对象的内存占用，而非其管理的动态字符串数据
	cout << sizeof(string) << endl;
	cout << sizeof(str1) << endl;
	cout << sizeof(str2) << endl;

	cout << endl;
	cout << str1.size() << endl;
	cout << str1.capacity() << endl;
	cout << endl;
	cout << str2.size() << endl;
	cout << str2.capacity() << endl;
	
	//这里会发现str2是存储在堆上的，其他的都是存储在栈上的&str1取的是类型的地址在栈上
	//&str1和& str2取的是变量本身的地址，而非它们指向的数据地址
	printf("%p\n", &str1);
	printf("%p\n", &str2);
	//取得是存储真正字符串的位置发现如果大于15字符就存在堆上，小于就存在栈上
	printf("%p\n", &str1[0]);
	printf("%p\n", &str2[0]);
}

int main()
{
	test();
	return 0;
}